Skip to content

Conversation

@funnyDevGirl
Copy link

Приветствую!
Когда в тесте используется @transactional, то в классах доменных моделей будут загружены и поля с ленивой загрузкой, т.е. там, где потенциально могло вылететь исключение LazyInitializationException, оно не вылетет, и тест покажет ложный результат.
Есть и другие возможные проблемы, подробнее:
https://dev.to/henrykeys/don-t-use-transactional-in-tests-40eb

Рекомендуется писать тесты без @transactional и удалять данные вручную или использовать расширения.

@AfterEach
public void clean() {
    postCommentRepository.deleteAll();
    postRepository.deleteAll();
    userRepository.deleteAll();
}

@fey fey requested a review from Malcom1986 August 20, 2024 18:01
@Malcom1986
Copy link
Contributor

А давайте лучше очищать базу не после теста, а перед каждым тестом. В большинстве случаев очистка после теста стработает нормально, но не во всех. Нет абсолютной гарантии, что AfterEach выполнится (например, свет отключили). Тогда база останется не очищенной. Очистка базы перед тестом должна решить эту проблему

@Malcom1986
Copy link
Contributor

@funnyDevGirl Алина, приветствую! Вы доработаете этот ПР?

@funnyDevGirl
Copy link
Author

funnyDevGirl commented Jan 18, 2025

@Malcom1986 Максим, здравствуйте!
Да, приступаю)

@funnyDevGirl
Copy link
Author

funnyDevGirl commented Jan 18, 2025

Дополнительно скорректировала следующий момент:

Использовать get() без предварительной проверки на isPresent() - плохая практика.
В данном случае более предпочтительным вариантом будет использовать orElseThrow() вместо get().
Подробнее:
https://stackoverflow.com/questions/49158806/optional-get-versus-overloaded-optional-orelsethrow

// плохо
var post = postRepository.findBySlug(testPost.getSlug()).get();

// хорошо
var post = postRepository.findBySlug(testPost.getSlug()).orElseThrow();

.andExpect(status().isCreated());

var post = postRepository.findBySlug(testPost.getSlug()).get();
var post = postRepository.findBySlug(testPost.getSlug()).orElseThrow();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давайте тут лучше не бросать исключение, ловить то это исключение некому. А вместо этого использовать orElse и возвращать null, тем более что ниже мы проверяем пост на null. В случае, если пост мы не найдем, вывод будет более информативный, чем тесты просто упадут с исключением

@funnyDevGirl
Copy link
Author

@Malcom1986
Максим, приветствую!
Сделано)

@Malcom1986 Malcom1986 merged commit d65c208 into hexlet-components:main Feb 5, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants